Intel 8087

Эта статья находится на начальном уровне проработки, в одной из её версий выборочно используется текст из источника, распространяемого под свободной лицензией
Материал из энциклопедии Руниверсалис
Intel 8087
Центральный процессор
Математический сопроцессор Intel 8087Математический сопроцессор Intel 8087
Производство 1980
Разработчик Intel
Производители
Частота ЦП 4—10 MHz
Технология производства 3 μm (3 мкм) мкм
Наборы инструкций x86, x87
Число ядер 1
Разъём
Ядра

Intel 8087 — первый математический сопроцессор для линейки процессоров 8086, реализующий архитектуру набора команд x87 и выпущенный в 1980 году компанией Intel[3][4].

Сопроцессор 8087 был предназначен для увеличения быстродействия при вычислениях с плавающей точкой за счёт ускорения таких операций как сложение, вычитание, деление и извлечение квадратного корня. Он также мог вычислять трансцендентные функции, например экспоненциальную функцию, логарифмы и тригонометрические функции. Прирост производительности от установки сопроцессора составлял от 20 % до 500 %, в зависимости от специфики задач. Intel 8087 имел производительность около 50000 Флопс[3] и потреблял примерно 2,4 Ватт[4]. Выгода от установки 8087 проявлялась только при выполнении математических операций. Компьютеры, использовавшиеся, например, для обработки текстов, не выигрывали от дополнительных расходов (примерно $150[5]) и увеличения потребляемой мощности.

С выпуском фирмой IBM компьютера IBM PC, имевшего сокет для установки сопроцессора, продажи 8087 значительно повысились. Появление сопроцессора привело к созданию стандарта IEEE 754-1985 для арифметики с плавающей точкой. Поздние процессоры Intel, начиная с 80486, имеют встроенный арифметический сопроцессор (за исключением 486SX — для них выпускался сопроцессор 487SX, который можно было не устанавливать).

История создания и устройство

Ранее компанией Intel выпускались микросхемы 8231 «Арифметического процессора» и 8232 «Процессора операций с плавающей точкой». Они были разработаны для использования с процессором 8080 или его аналогами и использовали 8-битную шину данных. Основной процессор взаимодействовал с ними через инструкции ввода-вывода, либо через контроллер DMA[6].

Первые шаги в разработке 8087 предпринял Билл Полман (англ. Bill Pohlman) — менеджер проекта, контролировавший разработку микропроцессора 8086 в Intel. Он обеспечил поддержку математического сопроцессора, который ещё только предстояло разработать, со стороны 8086.

В 1977 году Полман получил «зелёный свет» на разработку математического сопроцессора 8087. Архитектором был назначен Брюс Ревенел (англ. Bruce Ravenel), в качестве помощника архитектора и математика проекта был нанят Джон Палмер (англ. John Palmer). Вместе они разработали новаторскую архитектуру, предусматривавшую использование для промежуточных вычислений 80-битного вещественного числа с 64-битной мантиссой и 16-битной экспонентой, стековую организацию сопроцессора с восемью 80-битными регистрами и набор инструкций, обеспечивающий вычисление большого числа математических функций. 80-битный формат решал ряд известных трудностей организации вычислений и создания программного обеспечения для числовой обработки: было значительно снижено влияние ошибок округления при работе с 64-битными вещественными операндами, а также обеспечена точность вычислений для 18-значных двоично-десятичных и целых 64-битных чисел. Палмер отмечал, что большое влияние на проект оказали публикации Уильяма Кэхэна по вычислениям с плавающей точкой[7].

Руководство Intel в Санта-Кларе прохладно отнеслось к проекту 8087 из-за его высоких требований. В конце концов, разработка была передана в израильское отделение компании, а руководителем, ответственным за изготовление микросхемы был назначен Рафи Неф (англ. Rafi Nave). Палмеру, Ревенелу и Нефу был выдан патент на архитектуру сопроцессора[8]. Роберту Келеру (англ. Robert Koehler) и Джону Бейлису (англ. John Bayliss) был выдан патент на способ передачи сопроцессору инструкций с определенной битовой комбинацией[9].

Сопроцессорор 8087 был выпущен в 1980 году и содержал 45000 транзисторов. Он был изготовлен по техпроцессу 3 мкм. Производство Intel 8087 осуществлялось в Малайзии[4].

Для сопроцессора было введено более 60 новых инструкций, название которых начиналось на «F», для того, чтобы отличать их от целочисленных инструкций Intel 8086. Например, аналоги команд ADD/MUL/CMP, в 8087 выглядели как FADD/FMUL/FCOM. Бинарные кодировки для всех новых инструкций начинались с комбинации битов 11011. Эта комбинация соответствует числу 27 в десятичной системе, совпадающему с кодом ASCII символа ESC, поэтому она иногда называлась Escape-кодом. Код инструкции занимает 6 бит в двух байтах, начинающихся с указанной комбинации:

 ┌───────────┬───────────┐
 │ 1101 1xxx │ mmxx xrrr │
 └───────────┴───────────┘

Значения битов:

x — код инструкции
m — режим адресации
r — регистр-операнд или набор регистров, участвующих в вычислении смещения[10]

Приложения должны были быть специально написаны для использования инструкций с плавающей точкой. Во время запуска программа должна была определить наличие сопроцессора и использовать его для этих инструкций; в противном случае, инструкции сопроцессора должны были эмулироваться программно[5].

Регистры

Упрощённая архитектура Intel 8087. Слева — блок управления: буфер данных, регистры статуса и адресации. Справа — блок исполнения: стек регистров, модуль изменения экспонент, модуль программируемого сдвига, арифметический модуль, временные регистры.

Семейство сопроцессоров x87 вместо непосредственно адресуемых регистров как в архитектуре x86, использует восьмиуровневый стек регистров[11], при этом возможно обращаться к любому элементу стека по индексу от st0 до st7, где st0 — вершина стека. Положение вершины стека задается полем ST регистра состояния. Инструкции при выполнении извлекают операнды с вершины стека и проталкивают результаты в стек. Инструкции с двумя операндами типа FADD, FMUL, FCOM могут оперировать как с двумя верхними элементами стека, так и напрямую брать один из операндов из произвольной позиции стека.

Стандарт IEEE для чисел с плавающей точкой

При создании сопроцессора 8087 компания Intel рассчитывала стандартизировать формат чисел с плавающей точкой для последующих разработок. С исторической точки зрения важность 8087 состоит в том, что он стал основой для стандарта с плавающей точкой IEEE 754. Поскольку стандарт IEEE 754 находился в разработке до 1985 года, сопроцессор 8087 не полностью ему соответствовал, однако уже в сопроцессоре Intel 80387 было достигнуто полное соответствие стандарту. 8087 обеспечивал два основных типа данных с плавающей точкой (32-битный с одинарной точностью и 64-битный с двойной точностью), а также расширенный 80-битный формат для повышения точности больших и сложных расчётов. Помимо этого, 8087 предлагал 80-битный/18-значный двоично-десятичный формат, а также 16, 32 и 64-битные целочисленные типы[11].

Управление бесконечностью

8087 обрабатывает значения бесконечности через аффинное или проективное замыкание (режим выбирается через регистр состояния). В режиме аффинного замыкания положительная и отрицательная бесконечности рассматриваются как разные значения. В режиме проективного замыкания обе бесконечности считаются равными[12]. Эти два режима работы с бесконечностью были предложены в черновике стандарта IEEE 754. Однако из итоговой версии стандарта режим проективного замыкания был исключен. В сопроцессоре 80287 режим проективного замыкания был сохранён как опция, а сопроцессор 80387 и последующие (включая 80187) поддерживали только режим аффинного замыкания.

Подключение сопроцессора

Сопроцессор 8087 отличается от более поздних моделей сопроцессоров Intel тем, что он напрямую подключается к шинам адреса и данных. Процессоры 8086 и 8088 при нахождении инструкций, начинающихся с последовательности '11011' передают управление сопроцессору. Сопроцессор содержит такую же очередь инструкций как и процессор (настройка очереди на параметры процессора 8086 или 8088 производится путём анализа сигнала BHE после аппаратного сброса). Если инструкция требует обмена данными с памятью, процессоры 8088 или 8086 вычисляют их адрес и выполняют фиктивный цикл чтения, игнорируя сами данные. Фактическое чтение данных выполняет сопроцессор. Если требуется чтение более одного слова (байта), сопроцессор запрашивает управление шиной и выполняет чтение оставшейся части операнда, последовательно наращивая адрес[13].

После передачи сопроцессору инструкции основной процессор немедленно приступает к обработке следующей. Поэтому процессоры 8086 или 8088 могут работать параллельно с сопроцессором 8087. Однако, это может привести к двум нежелательным ситуациям:

  • если подряд идут несколько инструкций с плавающей точкой, сопроцессор может быть не готов к приёму очередной инструкции
  • если основной процессор должен обратиться к тем же данным, которые должна изменить инструкция сопроцессора, он может выполнить это обращение раньше, чем закончится инструкция сопроцессора[14]

Для синхронизации процессора и сопроцессора используется инструкция FWAIT, останавливающая работу основного процессора до появления сигнала от сопроцессора о том, что он завершил обработку. Транслятор с языка ассемблера автоматически вставляет эту инструкцию перед каждой инструкцией сопроцессора 8087[10]. В более поздних моделях сопроцессоров необходимость добавлять инструкцию FWAIT перед каждой инструкцией с плавающей точкой отпала, однако инструкция всё ещё нужна для синхронизации процессоров в случае их обращения к одним и тем же данным[15].

Существует риск отказа программы в случае невозможности декодирования инструкции сопроцессором. В более поздних моделях сопроцессоров Intel не использовалось такое подключение к шинам, а инструкции передавались сопроцессору основным процессором. Хотя это приводило к задержке выполнения инструкций, в то же время это позволяло избежать риска отказа программы, поскольку основной процессор проигнорирует инструкцию, которую не принял сопроцессор.

Варианты исполнения и аналоги

Цоколёвка сопроцессора Intel 8087

Сопроцессоры Intel 8087 выпускались в керамических корпусах типов CerDIP и PDIP, и были рассчитаны на работу в следующих диапазонах температур:

  • с префиксами C, D, QC и QD: от 0 °C до +70 °C (обычные применения)
  • с префиксами LC, LD, TC и TD: от −40 °C до +85 °C (промышленные применения)
  • с префиксами MC и MD: от −55 °C до +125 °C (военные применения)

Все варианты 8087 выпускались в 40-выводных DIP корпусах и работали при напряжении 5 Вольт, потребляя около 2,4 Ватт. В отличие от более поздних сопроцессоров Intel, 8087 должен был работать на той же тактовой частоте, что и основной процессор[5]. Суффиксы в обозначении микросхем определяли максимальную тактовую частоту:

Тактовые частоты 8087[4][11]
Обозначение микросхемы Частота
Intel 8087 5 МГц
Intel 8087-1 10 МГц
Intel 8087-2 8 МГц
Intel 8087-3 4 МГц
Intel 8087-6 6 МГц

Сопроцессор выпускался по лицензии фирмами AMD под обозначением AMD 8087[1] и Cyrix под обозначением Cyrix 8087[2]. В СССР выпускался аналог 8087 под обозначением К1810ВМ87[16].

Другие поколения сопроцессоров

Как и в случае с процессорами 8088 и 8086, сопроцессор 8087 был вытеснен новыми поколениями сопроцессоров Intel. К ним относятся 80287, 80387 и 80187. Начиная с 80486, процессоры Intel больше не требовали отдельного сопроцессора с плавающей точкой. Практически у всех у них сопроцессор был встроен в ядро процессора. Единственным исключением был процессор 80486SX, который представлял собой модификацию 80486DX с отключённым сопроцессором. Сопроцессор 80487 фактически был полноценным процессором i486DX, имевшим дополнительный контакт. При установке он отключал 80486SX.

Примечания

  1. 1,0 1,1 Shvets, Gennadiy AMD 8087 floating-point unit (недоступная ссылка). CPU World (8 October 2011). Дата обращения: 1 декабря 2011. Архивировано 25 января 2013 года.
  2. 2,0 2,1 Shvets, Gennadiy Cyrix 8087 floating-point unit (недоступная ссылка). CPU World (8 October 2011). Дата обращения: 1 декабря 2011. Архивировано 25 января 2013 года.
  3. 3,0 3,1 8087 (недоступная ссылка). Coprocessor Dot Info (2007). Дата обращения: 1 декабря 2011. Архивировано 7 июня 2008 года.
  4. 4,0 4,1 4,2 4,3 Intel FPU (недоступная ссылка). cpu-collection.de (2011). Дата обращения: 1 декабря 2011. Архивировано 25 января 2013 года.
  5. 5,0 5,1 5,2 Scott Mueller. Upgrading and repairing PCs, second edition. — Que Books, 1992. — С. 395-403. — ISBN 0-88022-856-3.
  6. Intel Component Data Catalog 1980, Intel catalog no. C-864/280/150K/CP, pages 8-21, 8-28
  7. Sanchez, Canton, 2007, с. 96.
  8. Патент США № 4484259
  9. Патент США № 4270167
  10. 10,0 10,1 Karen A. Lemone. Assembly Language and Systems Programming for the IBM PC and Compatibles. — Little, Brown and Comp., 1985. — С. 300. — ISBN 0-316-52069-1.
  11. 11,0 11,1 11,2 Shvets, Gennadiy Intel 8087 family (недоступная ссылка). CPU World (8 октября 2011). Дата обращения: 1 декабря 2011. Архивировано 1 сентября 2013 года.
  12. Sanchez, Canton, 2007, с. 110.
  13. Михаил Гук. Процессоры Intel: от 8086 до Pentium II. — СПб.: Питер, 1997. — С. 24. — 224 с. — ISBN 5-88782-398-4.
  14. M. Krishna Kumar. Микропроцессоры и микроконтроллеры/Сопроцессор Замечания к лекциям (недоступная ссылка). Дата обращения: 21 августа 2016. Архивировано 28 мая 2016 года.
  15. Морс С.П., Алберт Д.Д. Архитектура микропроцессора 80286 = The 80286 architecture. — М.: Радио и связь, 1990. — С. 160. — 304 с. — ISBN 5-256-00466-2.
  16. Нефедов А.В. Интегральные микросхемы и их зарубежные аналоги: Справочник.. — М.: ИП РадиоСофт, 2001. — Т. 11. — С. 500. — 512 с. — ISBN 5-93037-049-4.

Литература

Ссылки